package com.audaque.springboot.foshanupload.web.webdemo.controller;

import com.audaque.springboot.foshanupload.log.anno.WebLogAnno;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.swing.filechooser.FileSystemView;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@Slf4j
@RestController
@RequestMapping("processBuilder")
public class ProcessBuilderController {

    @WebLogAnno
    @GetMapping("/run1")
    public void run1() throws Exception {
        try {
            List<String> paramList = new ArrayList<>();
            //启动 windows 的计算器程序，第一个参数必须是可执行程序
            //        paramList.add("calc");
            paramList.add("C:\\Windows\\System32\\calc.exe");
            /** 创建ProcessBuilder对象，设置指令列表*/
            ProcessBuilder processBuilder = new ProcessBuilder(paramList);
            log.info("启动子进程...");
            Process process = processBuilder.start();
            log.info("子进程启动完成...");
        } catch (IOException e) {
            e.printStackTrace();
        }

    }


    @WebLogAnno
    @GetMapping("/run2")
    public void run2() throws Exception {
        try {
            List<String> paramList = new ArrayList<>();
            //启动 windows 上安装好的 potplayer 播放器，设置 exe 路径，路径必须存在
            //第一个参数必须是可执行程序
            paramList.add("D:\\dev\\PotPlayer\\PotPlayerMini.exe");
            //设置 potplayer 将要播放的文件，也就是给 potplayer 传递的参数，文件必须存在
            paramList.add("D:\\dev\\PotPlayer\\2024-11-07 17-00-27.mkv");

            /** 创建ProcessBuilder对象，设置指令列表*/
            ProcessBuilder processBuilder = new ProcessBuilder(paramList);
            log.info("启动子进程...");
            Process process = processBuilder.start();
            log.info("子进程启动完成...");
            for (int i = 5; i > 0; i--) {
                log.info((i) + " 秒后结束子进程...");
                Thread.sleep(1000);
            }
            process.destroyForcibly();//强行终结开启的子进程
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @WebLogAnno
    @GetMapping("/run3")
    public void run3() throws Exception {
        List<String> paramList = new ArrayList<>();
        //使用 cmd 命令 ping 远程主机
        //第一个参数必须是可执行程序,cmd也是一个可执行程序，位于 C:/Windows/System32目录下
        paramList.add("cmd");
        paramList.add("c/");
        paramList.add("ping www.taobao.com");//也可以是ip，如 paramList.add("ping 114.114.114.114");

        /** 创建ProcessBuilder对象，设置指令列表*/
        ProcessBuilder processBuilder = new ProcessBuilder(paramList);

        //获取桌面路径，如：C:\Users\Administrator.SC-201707281232\Desktop
        File desktopFile = FileSystemView.getFileSystemView().getHomeDirectory();

        //创建子进程输出信息的存放文件，文件不存在时，会自动创建
        File outputFile = new File(desktopFile, "output.txt");
        //返回此流程构建器的标准输出目标,意思是将来输出信息全部放在这个目标中
        processBuilder = processBuilder.redirectOutput(outputFile);
        processBuilder.start();//启动进程构建器
        log.info("子进程执行消息存放在：" + processBuilder.redirectOutput().file().getPath());

    }


}
